// /import core
// /import commands/inserthtml.js
// /commands 插入代码
baidu.editor.plugins['highlight'] = function() {
	var me = this, domUtils = baidu.editor.dom.domUtils, utils = baidu.editor.utils, browser = baidu.editor.browser;
	me.commands['highlightcode'] = {
		execCommand : function(cmdName, code, syntax) {
			if (code && syntax) {
				var pre = document.createElement("pre");
				pre.className = "brush: " + syntax + ";toolbar:false;";
				pre.style.display = "";
				pre.appendChild(document.createTextNode(code));
				document.body.appendChild(pre);
				if (me.queryCommandState("highlightcode")) {
					me.execCommand("highlightcode");
				}
				me.execCommand('inserthtml', SyntaxHighlighter.highlight(pre,
								null, true));
				var div = me.document.getElementById(SyntaxHighlighter
						.getHighlighterDivId());
				div.setAttribute('highlighter', pre.className);
				domUtils.remove(pre);
			} else {
				var range = this.selection.getRange(), start = domUtils
						.findParentByTagName(range.startContainer, 'table',
								true), end = domUtils.findParentByTagName(
						range.endContainer, 'table', true), codediv;
				if (start
						&& end
						&& start === end
						&& start.parentNode.className
								.indexOf("syntaxhighlighter") > -1) {
					codediv = start.parentNode;
					if (domUtils.isBody(codediv.parentNode)) {
						var p = me.document.createElement('p');
						p.innerHTML = baidu.editor.browser.ie ? '' : '<br/>';
						me.body.insertBefore(p, codediv);
						range.setStart(p, 0)
					} else {
						range.setStartBefore(codediv)
					}
					range.setCursor();
					domUtils.remove(codediv);
				}
			}
		},
		queryCommandState : function() {
			var range = this.selection.getRange(), start, end;
			range.adjustmentBoundary();
			start = domUtils.findParent(range.startContainer, function(node) {
						return node.nodeType == 1 && node.tagName == 'DIV'
								&& domUtils.hasClass(node, 'syntaxhighlighter')
					}, true);
			end = domUtils.findParent(range.endContainer, function(node) {
						return node.nodeType == 1 && node.tagName == 'DIV'
								&& domUtils.hasClass(node, 'syntaxhighlighter')
					}, true);
			return start && end && start == end ? 1 : 0;
		}
	};

	me.addListener('beforeselectionchange', function() {

				me.highlight = me.queryCommandState('highlightcode') == 1
						? 1
						: 0;
			});

	me.addListener('afterselectionchange', function() {
				me.highlight = 0;
			});
	me.addListener("ready", function() {
				if (!document.getElementById("syntaxhighlighter_js")) {
					var obj = {
						id : "syntaxhighlighter_js",
						src : me.options.UEDITOR_HOME_URL
								+ "third-party/SyntaxHighlighter/shCore.js",
						tag : "script",
						type : "text/javascript",
						defer : "defer"
					};
					utils.loadFile(document, obj, function() {
								changePre();
							});
				}
				if (!me.document.getElementById("syntaxhighlighter_css")) {
					var obj = {
						id : "syntaxhighlighter_css",
						tag : "link",
						rel : "stylesheet",
						type : "text/css",
						href : me.options.UEDITOR_HOME_URL
								+ "third-party/SyntaxHighlighter/shCoreDefault.css"
					}
					utils.loadFile(me.document, obj);
				}

			});
	me.addListener("beforegetcontent", function(type, cmd) {
				for (var i = 0, di, divs = domUtils.getElementsByTagName(
						me.body, 'div'); di = divs[i++];) {
					if (di.className == 'container') {
						var pN = di.parentNode;
						while (pN) {
							if (pN.tagName == 'DIV'
									&& /highlighter/.test(pN.id)) {
								break;
							}
							pN = pN.parentNode;
						}
						var pre = me.document.createElement('pre');
						for (var str = [], c = 0, ci; ci = di.childNodes[c++];) {
							str.push(ci[browser.ie
									? 'innerText'
									: 'textContent']);
						}
						pre.appendChild(me.document.createTextNode(str
								.join('\n')));
						pre.className = pN.getAttribute('highlighter');
						pN.parentNode.insertBefore(pre, pN);
						domUtils.remove(pN);
					}
				}
			});
	me.addListener("aftergetcontent", function(type, cmd) {
				changePre();
			});

	function changePre() {
		for (var i = 0, pr, pres = domUtils.getElementsByTagName(me.document,
				"pre"); pr = pres[i++];) {
			if (pr.className.indexOf("brush") > -1) {

				var pre = document.createElement("pre"), txt, div;
				pre.className = pr.className;
				pre.style.display = "none";
				pre.appendChild(document.createTextNode(pr[browser.ie
						? 'innerText'
						: 'textContent']));
				document.body.appendChild(pre);
				try {
					txt = SyntaxHighlighter.highlight(pre, null, true);
				} catch (e) {
					domUtils.remove(pre);
					return;
				}

				div = me.document.createElement("div");
				div.innerHTML = txt;

				div.firstChild.setAttribute('highlighter', pre.className);
				pr.parentNode.insertBefore(div.firstChild, pr);

				domUtils.remove(pre);
				domUtils.remove(pr);
			}
		}
	}
	me.addListener("aftersetcontent", function() {

				changePre();
			})
};
